import re
import pytz
from datetime import datetime
from utils.logging_conf import logger


class NginxLogInfo(object):
    def __init__(self,check_interval=60):
        self.check_interval = check_interval
        self.log_info = []
        self.start_time = None

    def parse_nginx_log(self,line,log_pattern: "str" = r'^(\S+) \- (\S+) \[([^\]]+)\] "(\S+ \S+ \S+)" (\d+) (\d+) "([^"]*)" "([^"]*)" "([^"]*)"$'):
        match = re.match(log_pattern, line.strip())
        if not match:
            logger.error(f"⚠️  日志格式不匹配，跳过：{line[:60]}...")
            return None
        try:
            # 提取日志字段，与log_format main一一对应
            return {
                'remote_addr': match.group(1),  # 客户端IP（$remote_addr）
                'remote_user': match.group(2),  # 远程用户（$remote_user，通常为"-"）
                'time_local': datetime.strptime(match.group(3), '%d/%b/%Y:%H:%M:%S %z'),  # 访问时间（$time_local）
                'request': match.group(4),  # 完整请求（$request，如"GET /api HTTP/2.0"）
                'status': int(match.group(5)),  # 响应状态码（$status）
                'body_bytes_sent': int(match.group(6)),  # 发送给客户端的字节数（$body_bytes_sent）
                'http_referer': match.group(7),  # 来源页面（$http_referer，通常为"-"）
                'http_user_agent': match.group(8),  # 客户端浏览器信息（$http_user_agent）
                'http_x_forwarded_for': match.group(9)  # 代理IP（$http_x_forwarded_for，无则为"-"）
            }
        except Exception as e:
            logger.error(f"❌ 解析日志失败：{str(e)}，日志行：{line[:60]}...")
            return None

    def check_queue(self):
        """ 检查队头是否超时，并且移除队头
            满足条件：1.超时，
        """

        if len(self.log_info)>=2:
            tz = pytz.timezone('Asia/Shanghai')  # 或直接使用self.start_time.tzinfo获取时区
            if  (datetime.now(tz) - self.start_time).total_seconds()>=self.check_interval:
                self.log_info.pop(0)
                self.start_time = self.log_info[0].get('time_local')
                self.check_queue()

    def get_status_info(self):
        data = {}
        for log in self.log_info:
            status = log.get('status')
            data[status] = data.get(status,0) + 1

        return data

    def get_ip_info(self):
        data = {}
        for log in self.log_info:
            ip = log.get('remote_addr')
            data[ip] = data.get(ip, 0) + 1
        return data

    def append(self,log:dict):
        self.log_info.append(log)
        if not self.start_time:
            self.start_time = log.get('time_local')
        self.check_queue()